#include<jsoncpp/json/json.h>
#include<iostream>
#include<string>
#include<sstream>
#include<memory>
using namespace std;


void serialize(Json::Value &value,string &body)//JSON序列化
{
    Json::StreamWriterBuilder swb;//实例化
    swb["commentStyle"]="None";
    //Json::StreamWriter *sw=swb.newStreamWriter();
    unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());//智能指针对象
    //int write(Value const& root,ostream* sout) 参数：Json对象+输出流指针
    stringstream ss;
    int ret=sw->write(value,&ss);//进行序列化
    if(ret!=0)//存储正常，返回0
    {
        cout<<"serialize failed!!"<<endl;
        //delete sw;
        return;
    }
    body=ss.str();//获取字符串结果
    //delete sw;
    return; 
}

bool unserialize(string &body,Json::Value &value)//JSON反序列化,对字符串进行反序列化
{
    Json::CharReaderBuilder crb;

    unique_ptr<Json::CharReader> cr(crb.newCharReader());
    string err;//反序列化错误，需要保存信息
    bool ret=cr->parse(body.c_str(),body.c_str()+body.size(),&value,&err);//字符串起始位置，字符串终止位置，需要解析到Json对象中，错误信息保存地址
    if(ret==false)//字符串解析失败，数据格式必须正确
    {
        cout<<"unserialize failed!!"<<endl;
        return false;
    }
    return true;
}
int main()
{
    Json::Value val;
    val["姓名"]="小明";
    val["年龄"]=18;
    val["成绩"].append(55);
    val["成绩"].append(90);
    val["成绩"].append(82);
    string body;
    serialize(val,body);
    cout<<body<<endl;

    Json::Value stu;
    unserialize(body,stu);
    cout<<stu["姓名"].asString()<<endl;
    cout<<stu["年龄"].asInt()<<endl;
    if(stu["成绩"].isArray()){//判断 成绩 是否是一个数组
        for(int i=0;i<stu["成绩"].size();i++){
            cout<<stu["成绩"][i].asInt()<<endl;
        }
    }
    return 0;
}